﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Globalization;

namespace WcfService
{
    public class Util
    {
        public static Boolean ToBoolean(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();

            Boolean retVal = false;

            if (sValue == "1" || sValue.ToLower() == "true")
                retVal = true;
            else if (!Boolean.TryParse(sValue, out retVal))
                retVal = false;


            return retVal;
        }

        public static String ToString(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();
            return sValue;
        }

        public static Int32 ToInt32(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();
            Int32 retVal = 0;

            /*Hàm Int32.TryParse thực hiện dựa theo CurrentCulture của chương trình.
            --> Để có thể sử dụng được tốt việc UISetting từ String sang Int32 
             chỉ cần thay thế ký tự phân cách hàng nghìn thành ký tự trắng. ký tự phân cách thập phân không quan tâm
            */
            //sValue = sValue.Replace(Program.GroupSeparator, "");
            NumberFormatInfo numFormat = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat;
            //
            sValue = sValue.Replace(numFormat.NumberGroupSeparator, "");

            if (!Int32.TryParse(sValue, out retVal))
                retVal = 0;
            return retVal;
        }

        public static Int64 ToInt64(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();
            Int64 retVal = 0;

            /*Hàm Int32.TryParse thực hiện dựa theo CurrentCulture của chương trình.
            --> Để có thể sử dụng được tốt việc UISetting từ String sang Int32 
             chỉ cần thay thế ký tự phân cách hàng nghìn thành ký tự trắng. ký tự phân cách thập phân không quan tâm
            */
            //sValue = sValue.Replace(Program.GroupSeparator, "");
            NumberFormatInfo numFormat = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat;
            //
            sValue = sValue.Replace(numFormat.NumberGroupSeparator, "");

            if (!Int64.TryParse(sValue, out retVal))
                retVal = 0;
            return retVal;
        }

        public static Decimal ToDecimal(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();

            Decimal retVal = 0;

            /*Hàm Decimal.TryParse thực hiện dựa theo CurrentCulture của chương trình.
            --> Để có thể sử dụng được tốt việc UISetting từ String sang Decimal 
             chỉ cần thay thế ký tự phân cách hàng nghìn thành ký tự trắng. ký tự phân cách thập phân không quan tâm
            */
            //sValue = sValue.Replace(Program.GroupSeparator, "");
            NumberFormatInfo numFormat = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat;
            //
            sValue = sValue.Replace(numFormat.NumberGroupSeparator, "");

            if (!Decimal.TryParse(sValue, out retVal))
                retVal = 0;
            return retVal;
        }

        public static Double ToDouble(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();

            Double retVal = 0;

            /*Hàm Decimal.TryParse thực hiện dựa theo CurrentCulture của chương trình.
            --> Để có thể sử dụng được tốt việc UISetting từ String sang Decimal 
             chỉ cần thay thế ký tự phân cách hàng nghìn thành ký tự trắng. ký tự phân cách thập phân không quan tâm
            */
            //sValue = sValue.Replace(Program.GroupSeparator, "");
            NumberFormatInfo numFormat = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat;
            //
            sValue = sValue.Replace(numFormat.NumberGroupSeparator, "");

            if (!Double.TryParse(sValue, out retVal))
                retVal = 0;
            return retVal;
        }

        public static DateTime ToDateTime(object obj)
        {
            string sValue = "";
            if (obj != null)
                sValue = obj.ToString();
            sValue = sValue.Trim();

            System.DateTime outDate = DateTime.MinValue;

            if (System.DateTime.TryParseExact(sValue, "dd/MM/yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out outDate))
            {
                return outDate;
            }
            else if (System.DateTime.TryParseExact(sValue, "MM/dd/yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out outDate))
            {
                return outDate;
            }
            else if (DateTime.TryParseExact(sValue, "d/M/yyyy", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }
            else if (DateTime.TryParseExact(sValue, "dd/MM/yy", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }
            else if (DateTime.TryParseExact(sValue, "MMM dd yyyy", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }
            else if (DateTime.TryParseExact(sValue, "MMM dd yyyy HH:mmtt", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }

            else if (DateTime.TryParseExact(sValue, "d-MM-yyyy", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }

            else if (DateTime.TryParseExact(sValue, "dd-MM-yyyy", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }
            else if (DateTime.TryParseExact(sValue, "d/M/yyyy", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }
            else if (DateTime.TryParseExact(sValue, "yyyy'-'MM'-'dd'T'HH':'mm':'ss", null, DateTimeStyles.None, out outDate))
            {
                return outDate;
            }
            else if (System.DateTime.TryParse(sValue, out outDate))
            {
                return outDate;
            }
            else
            {
                return DateTime.MinValue;
            }
        }

    }
}